JS 函数的递归算法

一、什么是函数的递归
函数反复调用自己,直到最终结果,跳出

var n = 0;
shownumber();
function shownumber() {
    n += 1;
    if (n === 10000) {
        console.log(n);
        return;
    }
    shownumber();
}

二、举例
例1:递归阶乘函数

function factorial(num){
    if(num<=1){
        return 1;
    }
    else{
        return num*factorial(num-1);
    }
}

问题1:以上函数表面看起来没有问题,但下面代码会导致其出错,例:

var anotherFactorial=factorial;
factorial=null;
alert(anotherFactorial(3));  //出错 

以上代码先把factorial()函数保存在变量anotherFactorial中,然后将factorial变量设置为null,结果指向原始函数的引用只剩下一个。但在接下来调用anotherFactorial()时,由于必须执行factorial(),而factorial已经不再是一个函数,就会导致错误。因此,需用arguments.callee,即一个指向正在执行的函数的指针,可以用它来实现函数的递归调用,例:

function factorial(num){
    if(num<=1){
        return 1;
    }
    else{
        return num*arguments.callee(num-1);
    }
}

问题2:在严格模式下,不能通过脚本访问arguments.callee,访问这个属性会导致错误。因此,可使用命名函数表达式来达成相同结果,例:

var factorial=(function f(num){
    if(num<=1){
        return 1;
    }
    else{
        return num*f(num-1);
    }
});
var anotherFactorial=factorial;
factorial=null;
alert(anotherFactorial(4));

以上代码创建了一个名为f()的命名函数表达式,然后将它赋值给变量factorial。即便把函数赋值给了另一个变量,函数的名字f仍然有效。

例2:5的n!

function jiecheng(n) {
    if (n == 0) {
        return 1;
    }
    return jiecheng(n - 1) * n;
}
console.log(jiecheng(5));

//f(3)=f(2)*3;    f(3)=1*1*2*3
//f(2)=f(1)*2;
//f(1)=f(0)*1

例3:Fibonacci数列 1,1,2,3,5,8,13,21
当前位的值

var fib = function (n) {
    if (n <= 2) {
        return 1;
    }
    return fib(n - 2) + fib(n - 1);
}
console.log(fib(3));

//fib(3)    fib(1)+fib(0)+fib(1)
//fib(2)   fib(1)+fib(0)

例4:1-100之和

function f1(x) {
    if (x <= 0) {
        return 0;
    }
    return x + f1(x - 1);
}
console.log(f1(100));
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值